#include "common.h"
#include "SystemClock.h"

// 基本时钟配置宏定义
#define AHB_PRESCALER_1 (uint32_t)(0x00)  // AHB不分频
#define APB1_PRESCALER_1 (uint32_t)(0x00) // APB1不分频
#define APB2_PRESCALER_1 (uint32_t)(0x00) // APB2不分频

ErrorStatus System_Hsi_Colk(void)
{
    uint32_t timeout = 0;

    // 复位 RCC->CFGR 为 00；
    RCC->CIR = 1 << 23 | 1 << 20 | 15 << 19; // 清相应的中断

    // 使能HSI
    RCC->CR |= RCC_CR_HSION;

    // 等待HSI就绪，添加超时保护
    while ((RCC->CR & RCC_CR_HSIRDY) == 0)
    {
        timeout++;
        if (timeout > 0x1000)
        {
            return ERROR;
        }
    }

    // 设置Flash访问延时
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    // 配置AHB、APB1、APB2分频系数为1
    RCC->CFGR &= ~((uint32_t)0xFF << 4); // 清除原有分频设置
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;     // AHB不分频
    RCC->CFGR |= RCC_CFGR_PPRE_DIV1;     // APB1不分频
    RCC->CFGR |= RCC_CFGR_PPRE_DIV1;     // APB2不分频

    // 选择HSI作为系统时钟
    RCC->CFGR &= ~((uint32_t)3); // 清除原有时钟源设置

    // 等待HSI被选为系统时钟，添加超时保护
    timeout = 0;
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)
    {
        timeout++;
        if (timeout > 0x1000)
        {
            return ERROR;
        }
    }

    return SUCCESS;
}

ErrorStatus SystemClock_Init(void)
{
    ErrorStatus status = SUCCESS;

    // 复位RCC到默认状态
    RCC_DeInit();

    // 配置Flash访问时序
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    // 配置HSI作为系统时钟
    status = System_Hsi_Colk();
    if (status != SUCCESS)
    {
        return ERROR;
    }

    // 配置总线分频
    RCC->CFGR &= ~(0xFF << 4);             // 清除分频设置
    RCC->CFGR |= (AHB_PRESCALER_1 << 4);   // AHB不分频
    RCC->CFGR |= (APB1_PRESCALER_1 << 8);  // APB1不分频
    RCC->CFGR |= (APB2_PRESCALER_1 << 11); // APB2不分频

    return SUCCESS;
}
